import { IsString, IsOptional, IsBoolean, Length, Matches, IsUrl, IsPhoneNumber } from 'class-validator';

// 创建用户DTO
export class CreateUserDto {
  @IsString({ message: '账号必须为字符串' })
  @Length(4, 20, { message: '账号长度必须在4-20之间' })
  username: string;

  @IsString({ message: '密码必须为字符串' })
  @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/, {
    message: '密码至少8位，包含大小写字母和数字',
  })
  password: string;

  @IsOptional()
  @IsUrl({}, { message: '图片必须是有效的URL' }) // 验证是否为合法URL
  userImage?: string; // 可选：直接传递图片URL

  @IsOptional()
  @IsBoolean({ message: '记住密码必须为布尔值' })
  rememberMe?: boolean = false;
}

// 更新用户DTO
export class UpdateUserDto {
  @IsOptional()
  @IsString({ message: '账号必须为字符串' })
  @Length(4, 20, { message: '账号长度必须在4-20之间' })
  username?: string;

  @IsOptional()
  @IsString({ message: '密码必须为字符串' })
  @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/, {
    message: '密码至少8位，包含大小写字母和数字',
  })
  password?: string;

  @IsOptional()
  @IsUrl({}, { message: '图片必须是有效的URL' })
  userImage?: string; // 可选：更新图片URL

  @IsOptional()
  @IsBoolean({ message: '账号状态必须为布尔值' })
  isEnabled?: boolean;

  @IsOptional()
  @IsBoolean({ message: '记住密码必须为布尔值' })
  rememberMe?: boolean;
}

// 分页查询DTO（不变）
export class QueryUserDto {
  @IsOptional()
  @IsString({ message: '搜索关键词必须为字符串' })
  keyword?: string;

  @IsOptional()
  page: number = 1;

  @IsOptional()
  limit: number = 10;
}

// 登录DTO
export class LoginDto {
  @IsString({ message: '账号不能为空' })
  username: string;

  @IsString({ message: '密码不能为空' })
  password: string;

  @IsBoolean({ message: '记住密码必须为布尔值' })
  rememberMe?: boolean = false;
}

// 简化版：修改密码DTO（支持手机号/邮箱验证，替代旧密码）
export class ChangePasswordDto {
  @IsOptional()
  @IsString({ message: '旧密码不能为空' })
  oldPassword?: string; // 保留旧密码验证（可选）

  @IsOptional()
  @IsPhoneNumber('CN', { message: '手机号格式错误' })
  phone?: string; // 二选一：手机号验证

  @IsOptional()
  @IsString({ message: '邮箱格式错误' })
  email?: string; // 二选一：邮箱验证

  @IsString({ message: '新密码必须为字符串' })
  @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/, {
    message: '新密码至少8位，包含大小写字母和数字',
  })
  newPassword: string;
}

// 简化版：找回密码DTO（仅验证手机号/邮箱）
export class FindPasswordDto {
  @IsString({ message: '账号不能为空' })
  username: string;

  @IsOptional()
  @IsPhoneNumber('CN', { message: '手机号格式错误' })
  phone?: string; // 二选一

  @IsOptional()
  @IsString({ message: '邮箱格式错误' })
  email?: string; // 二选一

  @IsString({ message: '新密码必须为字符串' })
  @Matches(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/, {
    message: '新密码至少8位，包含大小写字母和数字',
  })
  newPassword: string;
}